package sistema.seguimiento.items.domain.descargasEA;

import java.util.Date;
import java.util.List;

/**
 * Sistema de seguimiento de items.
 * @author Mauri
 * @version 1.0
 * @created 06-jun-2012 10:03:11 p.m.
 */
public class IssueTrackingSystem {

	private String name;
	public Issue systemIssues;
	public User users;
	public Project projects;

	public IssueTrackingSystem(){

	}

	public void finalize() throws Throwable {

	}

	/**
	 * 
	 * @param aProject
	 */
	private void addProject(Project aProject){

	}

	/**
	 * retorna los estados del issueType del workflow seleccionado.
	 * 
	 * @param aIssueType
	 * @param aProject
	 */
	public List<IssueTypeWorkflow> getWorkflowStates(IssueTypeWorkflow aIssueType, Project aProject){
		return null;
	}

	/**
	 * cambia el estado del issue
	 * 
	 * @param aUser    usuario responsable del estado
	 * @param aIssue    issue que cabia de estado
	 * @param aState    estado al que cabia el issue
	 */
	public void changeState(User aUser, Issue aIssue, StateTypeWorkflow aState){
		//Cambia el estado del Issue seleccionado.
		//En caso de que el el estado al cual se
		//pretende pasar no es valido, no se
		//permitira la transicion al estado
		//esperado.


	}

	/**
	 * crea un nuevo issue type
	 * 
	 * @param aWorkflow    workflow para el que se crea el issue.
	 * @param aTypeObject    tipo de issue que se quiere crear
	 * @param aUser    usuario que crea el nuevo issue
	 */
	public void createIssue(Workflow aWorkflow, IssueTypeWorkflow aTypeObject, User aUser){

	}

	/**
	 * crea un tipo de issue para el workflow del proyecto especificado.
	 * 
	 * @param aName    nombre del nuevo tipo de issue
	 * @param aWorkflow    workflow del proyecto especificado
	 */
	public IssueTypeWorkflow createIssueType(String aName, Workflow aWorkflow){
		return null;
	}

	/**
	 * crea un tipo de estado por el que puede pasar un tipo de issue
	 * 
	 * @param aName    nombre del estado
	 * @param aIssueType    tipo del issue
	 * @param aWorkflow    workflow del tipo de issue
	 */
	public void createStateType(String aName, IssueTypeWorkflow aIssueType, Workflow aWorkflow){

	}

	/**
	 * crea un usuario para un proyecto y su workflow determinados. Este metodo es
	 * invocado desde la interfaz del usuario root.
	 * 
	 * @param aUserType    tipo de usuario que se desea crear
	 * @param aWorkflow    workflow del proyecto seleccionado y  al cual se desea
	 * agregar al usuario.
	 * @param aProject    proyecto de desarrollo de software seleccionado
	 * @param aUser    Usuario que envia el mensaje.
	 * @param aPassword    pass del usuario a crear
	 * @param aLogin    nombre utilizado en el login por el usuario a crear
	 * @param lastName    nombres del usuario
	 * @param firstName    apellidos del usuario
	 */
	public void createUser(UserType aUserType, Workflow aWorkflow, Project aProject, User aUser, String aPassword, String aLogin, String lastName, String firstName){

	}

	/**
	 * retorna los issues de un workflow
	 * 
	 * @param aWorkflow    workflow del cual se quiere obtener los issues
	 */
	public List<Issue> getIssues(Workflow aWorkflow){
		//Recupera la lista de issues asociadas
		//al proyecto seleccionado.

		return null;
	}

	/**
	 * Retorna el proyecto seleccionado desde una componente grafica. Por lo tanto
	 * solamente sera invocado desde la UI.
	 */
	public Project selectProject(){
		//Se selecciona un proyecto en particular.
		//Dependiendo del tipo de usuario va a
		//poder ver y seleccionar todos o algunos.

		return null;
	}

	/**
	 * selecciona un workflow del proyecto especificado como parametro desde una
	 * componente grafica.
	 * 
	 * @param aProject    Proyecto de desarrollo de software con todos los usuarios y
	 * workflows.
	 */
	public Workflow selectWorkflow(Project aProject){
		return null;
	}

	/**
	 * Determina quien es el usuario responsable de un issue dentro de un workflow
	 * 
	 * @param aWorkflow    worflow del issue
	 * @param aDate    fecha en la que se quiere saber el responsable del item
	 * @param aIssue    issue del cual se quiere saber su responsable
	 */
	public User whoIsResponsible(Workflow aWorkflow, Date aDate, Issue aIssue){
		return null;
	}

}